2-27 25.K个一组翻转链表
Date:2022-02-27 17:45:52
三个小表情表示题目难度:😄简单 😕中等 😟困难
题目:25.K个一组翻转链表 (😟)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例
示例1
给你这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
分析
这个题难度较大,有时间再处理,今天先练习一个简单的题 扩展1:206. 反转链表
题解
TODO
扩展1:206. 反转链表 (😄)
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例1
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
分析
该题有两种解法,迭代法和递归法
迭代的时候有两个要点,1.向后推进 2.缓存下一个节点(否则会丢失后面的链)
递归可以模拟出栈的效果,所以操作的时候,就直接拿到链表尾巴了,而在本次上下文中又有当前节点信息,所以只需要操作让节点
题解
1.迭代法 时间O(n),空间O(1)
function reverseList1(head: ListNode): ListNode {
// [1,2,3,4,5]
let prev: ListNode | undefined
let curr = head
while (curr) {
// cache
const next = curr.next
// move pointer
curr.next = prev
prev = curr
curr = next
}
return prev
}
2.递归法 时间O(n),空间O(n)
function reverseList2(head: ListNode): ListNode {
// [1,2,3,4,5]
if (!head || !head.next) {
// the !head condition only for initial head value is undefined
return head
}
const newHead = reverseList2(head.next)
head.next.next = head
head.next = undefined // only for the tail node
return newHead
}